home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / netz / term / extras / source / term-source.lha / CursorPanel.c < prev    next >
C/C++ Source or Header  |  1995-07-04  |  9KB  |  369 lines

  1. /*
  2. **    CursorPanel.c
  3. **
  4. **    Editing panel for cursor key configuration
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_QUALIFIER=1,GAD_UP,GAD_DOWN,GAD_RIGHT,GAD_LEFT,
  13.         GAD_USE,GAD_LOAD,GAD_SAVE,GAD_CANCEL,GAD_DEFAULT,
  14.     };
  15.  
  16. BOOLEAN __regargs
  17. CursorPanel(struct CursorKeys *CursorKeys,STRPTR LastCursorKeys,struct Window *Parent)
  18. {
  19.     struct CursorKeys    *Keys;
  20.     ULONG             OldCRC;
  21.     BOOLEAN             CursorKeysChanged = FALSE;
  22.  
  23.     OldCRC = DoCRC(CursorKeys,sizeof(struct CursorKeys));
  24.  
  25.     if(Keys = (struct CursorKeys *)AllocVecPooled(sizeof(struct CursorKeys),MEMF_ANY))
  26.     {
  27.         struct LayoutHandle *Handle;
  28.  
  29.         CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));
  30.  
  31.         if(Handle = LT_CreateHandleTags(Window -> WScreen,
  32.             LH_LocaleHook,    &LocaleHook,
  33.         TAG_DONE))
  34.         {
  35.             struct Window *PanelWindow;
  36.  
  37.             LT_New(Handle,
  38.                 LA_Type,    VERTICAL_KIND,
  39.             TAG_DONE);
  40.             {
  41.                 LT_New(Handle,
  42.                     LA_Type,    VERTICAL_KIND,
  43.                     LA_LabelID,    MSG_V36_0029,
  44.                 TAG_DONE);
  45.                 {
  46.                     LT_New(Handle,
  47.                         LA_Type,        VERTICAL_KIND,
  48.                     TAG_DONE);
  49.                     {
  50.                         LT_New(Handle,
  51.                             LA_Type,    CYCLE_KIND,
  52.                             LA_LabelID,    MSG_MACROPANEL_KEY_MODIFIER_GAD,
  53.                             LA_ID,        GAD_QUALIFIER,
  54.                             LACY_TabKey,    TRUE,
  55.                             LACY_FirstLabel,MSG_MACROPANEL_NONE_TXT,
  56.                             LACY_LastLabel,    MSG_MACROPANEL_CONTROL_TXT,
  57.                         TAG_DONE);
  58.  
  59.                         LT_New(Handle,
  60.                             LA_Type,    XBAR_KIND,
  61.                         TAG_DONE);
  62.  
  63.                         LT_EndGroup(Handle);
  64.                     }
  65.  
  66.                     LT_New(Handle,
  67.                         LA_Type,        VERTICAL_KIND,
  68.                     TAG_DONE);
  69.                     {
  70.                         LT_New(Handle,
  71.                             LA_Type,    STRING_KIND,
  72.                             LA_LabelID,    MSG_CURSORPANEL_CURSOR_UP_GAD,
  73.                             LA_Chars,    30,
  74.                             LA_ID,        GAD_UP,
  75.                             GTST_MaxChars,    255,
  76.                         TAG_DONE);
  77.  
  78.                         LT_New(Handle,
  79.                             LA_Type,    STRING_KIND,
  80.                             LA_LabelID,    MSG_CURSORPANEL_CURSOR_DOWN_GAD,
  81.                             LA_Chars,    30,
  82.                             LA_ID,        GAD_DOWN,
  83.                             GTST_MaxChars,    255,
  84.                         TAG_DONE);
  85.  
  86.                         LT_New(Handle,
  87.                             LA_Type,    STRING_KIND,
  88.                             LA_LabelID,    MSG_CURSORPANEL_CURSOR_RIGHT_GAD,
  89.                             LA_Chars,    30,
  90.                             LA_ID,        GAD_RIGHT,
  91.                             GTST_MaxChars,    255,
  92.                         TAG_DONE);
  93.  
  94.                         LT_New(Handle,
  95.                             LA_Type,    STRING_KIND,
  96.                             LA_LabelID,    MSG_CURSORPANEL_CURSOR_LEFT_GAD,
  97.                             LA_Chars,    30,
  98.                             LA_ID,        GAD_LEFT,
  99.                             GTST_MaxChars,    255,
  100.                         TAG_DONE);
  101.  
  102.                         LT_EndGroup(Handle);
  103.                     }
  104.  
  105.                     LT_EndGroup(Handle);
  106.                 }
  107.  
  108.                 LT_New(Handle,
  109.                     LA_Type,VERTICAL_KIND,
  110.                 TAG_DONE);
  111.                 {
  112.                     LT_New(Handle,
  113.                         LA_Type,    XBAR_KIND,
  114.                         LAXB_FullSize,    TRUE,
  115.                     TAG_DONE);
  116.  
  117.                     LT_EndGroup(Handle);
  118.                 }
  119.  
  120.                 LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  121.                     LAGR_SameSize,    TRUE,
  122.                     LAGR_Spread,    TRUE,
  123.                 TAG_DONE);
  124.                 {
  125.                     LT_New(Handle,
  126.                         LA_Type,    BUTTON_KIND,
  127.                         LA_LabelID,    MSG_GLOBAL_USE_GAD,
  128.                         LA_ID,        GAD_USE,
  129.                         LABT_ReturnKey,    TRUE,
  130.                         LABT_ExtraFat,    TRUE,
  131.                     TAG_DONE);
  132.  
  133.                     LT_New(Handle,
  134.                         LA_Type,    BUTTON_KIND,
  135.                         LA_LabelID,    MSG_GLOBAL_DEFAULT_GAD,
  136.                         LA_ID,        GAD_DEFAULT,
  137.                         LABT_ExtraFat,    TRUE,
  138.                     TAG_DONE);
  139.  
  140.                     LT_New(Handle,
  141.                         LA_Type,    BUTTON_KIND,
  142.                         LA_LabelID,    MSG_GLOBAL_LOAD_GAD,
  143.                         LA_ID,        GAD_LOAD,
  144.                         LABT_ExtraFat,    TRUE,
  145.                     TAG_DONE);
  146.  
  147.                     LT_New(Handle,
  148.                         LA_Type,    BUTTON_KIND,
  149.                         LA_LabelID,    MSG_GLOBAL_SAVE_GAD,
  150.                         LA_ID,        GAD_SAVE,
  151.                         LABT_ExtraFat,    TRUE,
  152.                     TAG_DONE);
  153.  
  154.                     LT_New(Handle,
  155.                         LA_Type,    BUTTON_KIND,
  156.                         LA_LabelID,    MSG_GLOBAL_CANCEL_GAD,
  157.                         LA_ID,        GAD_CANCEL,
  158.                         LABT_EscKey,    TRUE,
  159.                         LABT_ExtraFat,    TRUE,
  160.                     TAG_DONE);
  161.  
  162.                     LT_EndGroup(Handle);
  163.                 }
  164.  
  165.                 LT_EndGroup(Handle);
  166.             }
  167.  
  168.             if(PanelWindow = LT_Layout(Handle,LocaleString(MSG_CURSORPANEL_CURSOR_PREFERENCES_TXT),NULL,0,0,IDCMP_CLOSEWINDOW,0,
  169.                 LAWN_HelpHook,        &GuideHook,
  170.                 LAWN_Parent,        Parent,
  171.                 WA_DepthGadget,        TRUE,
  172.                 WA_CloseGadget,        TRUE,
  173.                 WA_DragBar,        TRUE,
  174.                 WA_RMBTrap,        TRUE,
  175.                 WA_Activate,        TRUE,
  176.             TAG_DONE))
  177.             {
  178.                 struct IntuiMessage    *Message;
  179.                 BOOLEAN             Done = FALSE;
  180.                 ULONG             MsgClass,
  181.                              MsgQualifier;
  182.                 UWORD             MsgCode;
  183.                 struct Gadget        *MsgGadget;
  184.                 UBYTE             DummyBuffer[MAX_FILENAME_LENGTH],
  185.                             *DummyChar;
  186.                 struct FileRequester    *FileRequest;
  187.                 LONG             Modifier = 0,i;
  188.  
  189.                 GuideContext(CONTEXT_CURSOR);
  190.  
  191.                 PushWindow(PanelWindow);
  192.  
  193.                 LT_ShowWindow(Handle,TRUE);
  194.  
  195.                 for(i = 0 ; i < 4 ; i++)
  196.                 {
  197.                     LT_SetAttributes(Handle,GAD_UP + i,
  198.                         GTST_String,Keys -> Keys[Modifier][i],
  199.                     TAG_DONE);
  200.                 }
  201.  
  202.                 do
  203.                 {
  204.                     if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  205.                     {
  206.                         CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));
  207.  
  208.                         break;
  209.                     }
  210.  
  211.                     while(Message = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort))
  212.                     {
  213.                         MsgClass    = Message -> Class;
  214.                         MsgQualifier    = Message -> Qualifier;
  215.                         MsgCode        = Message -> Code;
  216.                         MsgGadget    = (struct Gadget *)Message -> IAddress;
  217.  
  218.                         GT_ReplyIMsg(Message);
  219.  
  220.                         LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
  221.  
  222.                         if(MsgClass == IDCMP_CLOSEWINDOW)
  223.                         {
  224.                             CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));
  225.  
  226.                             Done = TRUE;
  227.                         }
  228.  
  229.                         if(MsgClass == IDCMP_GADGETUP)
  230.                         {
  231.                             switch(MsgGadget -> GadgetID)
  232.                             {
  233.                                 case GAD_DEFAULT:
  234.  
  235.                                     ResetCursorKeys(Keys);
  236.  
  237.                                     for(i = 0 ; i < 4 ; i++)
  238.                                     {
  239.                                         LT_SetAttributes(Handle,GAD_UP + i,
  240.                                             GTST_String,Keys -> Keys[Modifier][i],
  241.                                         TAG_DONE);
  242.                                     }
  243.  
  244.                                     break;
  245.  
  246.                                 case GAD_QUALIFIER:
  247.  
  248.                                     for(i = 0 ; i < 4 ; i++)
  249.                                         strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_UP + i,TAG_DONE));
  250.  
  251.                                     Modifier = MsgCode;
  252.  
  253.                                     for(i = 0 ; i < 4 ; i++)
  254.                                     {
  255.                                         LT_SetAttributes(Handle,GAD_UP + i,
  256.                                             GTST_String,Keys -> Keys[Modifier][i],
  257.                                         TAG_DONE);
  258.                                     }
  259.  
  260.                                     break;
  261.  
  262.                                 case GAD_USE:
  263.  
  264.                                     for(i = 0 ; i < 4 ; i++)
  265.                                         strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_UP + i,TAG_DONE));
  266.  
  267.                                     CopyMem(Keys,CursorKeys,sizeof(struct CursorKeys));
  268.  
  269.                                     Done = TRUE;
  270.                                     break;
  271.  
  272.                                 case GAD_CANCEL:
  273.  
  274.                                     CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));
  275.  
  276.                                     Done = TRUE;
  277.                                     break;
  278.  
  279.                                 case GAD_LOAD:
  280.  
  281.                                     strcpy(DummyBuffer,LastCursorKeys);
  282.  
  283.                                     DummyChar = PathPart(DummyBuffer);
  284.  
  285.                                     *DummyChar = 0;
  286.  
  287.                                     LT_LockWindow(PanelWindow);
  288.  
  289.                                     if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_CURSORPANEL_LOAD_CURSOR_KEYS_TXT),DummyBuffer,FilePart(LastCursorKeys),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
  290.                                     {
  291.                                         if(!ReadIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  292.                                             ShowError(PanelWindow,ERR_LOAD_ERROR,IoErr(),DummyBuffer);
  293.                                         else
  294.                                         {
  295.                                             OldCRC = DoCRC(Keys,sizeof(struct CursorKeys));
  296.  
  297.                                             CursorKeysChanged = FALSE;
  298.  
  299.                                             strcpy(Config -> FileConfig -> CursorFileName,DummyBuffer);
  300.  
  301.                                             strcpy(LastCursorKeys,DummyBuffer);
  302.  
  303.                                             for(i = 0 ; i < 4 ; i++)
  304.                                             {
  305.                                                 LT_SetAttributes(Handle,GAD_UP + i,
  306.                                                     GTST_String,Keys -> Keys[Modifier][i],
  307.                                                 TAG_DONE);
  308.                                             }
  309.                                         }
  310.  
  311.                                         FreeAslRequest(FileRequest);
  312.                                     }
  313.  
  314.                                     LT_UnlockWindow(PanelWindow);
  315.  
  316.                                     break;
  317.  
  318.                                 case GAD_SAVE:
  319.  
  320.                                     strcpy(DummyBuffer,LastCursorKeys);
  321.  
  322.                                     DummyChar = PathPart(DummyBuffer);
  323.  
  324.                                     *DummyChar = 0;
  325.  
  326.                                     LT_LockWindow(PanelWindow);
  327.  
  328.                                     for(i = 0 ; i < 4 ; i++)
  329.                                         strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_UP + i,TAG_DONE));
  330.  
  331.                                     if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_CURSORPANEL_SAVE_CURSOR_KEYS_TXT),DummyBuffer,FilePart(LastCursorKeys),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
  332.                                     {
  333.                                         if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  334.                                             ShowError(PanelWindow,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  335.                                         else
  336.                                         {
  337.                                             strcpy(LastCursorKeys,DummyBuffer);
  338.  
  339.                                             CursorKeysChanged = FALSE;
  340.  
  341.                                             OldCRC = DoCRC(Keys,sizeof(struct CursorKeys));
  342.                                         }
  343.  
  344.                                         FreeAslRequest(FileRequest);
  345.                                     }
  346.  
  347.                                     LT_UnlockWindow(PanelWindow);
  348.  
  349.                                     break;
  350.                             }
  351.                         }
  352.                     }
  353.                 }
  354.                 while(!Done);
  355.  
  356.                 PopWindow();
  357.             }
  358.  
  359.             LT_DeleteHandle(Handle);
  360.         }
  361.  
  362.         FreeVecPooled(Keys);
  363.     }
  364.  
  365.     CursorKeysChanged |= (OldCRC != DoCRC(CursorKeys,sizeof(struct CursorKeys)));
  366.  
  367.     return(CursorKeysChanged);
  368. }
  369.